//
//  ConstructorView.swift
//  swiftStudy
//
//  Created by ext.zhangjunfei on 2021/7/21.
//

import SwiftUI

struct ConstructorView: View {
    
    let code_1:String
    let code_2:String
    let code_3:String
    
    init() {
        code_1 =
            """
            class Base{
                
                //指定构造方法
                init() {
                    print("init")
                }
                
                //便利构造方法
                convenience init(param:String){
                    
                    print("init \\(param)")
                    self.init()
                }
            }

            var b0 = Base()
            var b1 = Base(param: "初始化")
            """
        code_2 =
            """
            class Check{
                var pro:Int
                
                //可失败的构造方法
                init?(param:Int) {
                    //使用守护语句，当param>0时才进行构造
                    guard param>0 else {
                        print("请输入大于0的数字")
                        return nil
                    }
                    self.pro = param
                }
            }

            var check_1 = Check(param: 10)
            var check_2 = Check(param: -10)

            print(check_1!.pro)
            print(check_2!.pro)
            """
        code_3 =
            """
            class Temp{
                //析构函数
                deinit {
                    print("实例被销毁了")
                }
            }

            var temp:Temp? = Temp()
            //当实例被置为nil的时候，会执行析构函数
            temp = nil
            """
    }
    
    var body: some View {
        ScrollView{
            LazyVStack(alignment: HorizontalAlignment.leading, spacing: 10) {
                Section(header: SectionHeaderView(title: "概述")) {
                    CommonTextView(content: "构造方法，用于完成实例构造的方法。析构方法是构造方法的逆过程，一个实例要被销毁和释放的过程由析构方法来完成。再Swift语言中，类和结构体在构造完成前，必须完成其中存储属性的构造和初始化。")
                }
                Section(header: SectionHeaderView(title: "指定与便利构造方法")) {
                    CommonTextView(content: "对于类来说，构造方法有指定构造方法和便利构造方法。指定构造方法不需要任何关键字修饰，便利构造方法需要使用Convenience关键字来修饰。指定构造方法是类的基础构造方法，任何类都要至少有一个指定构造方法；便利构造方法是为了便利开发者使用，为类额外添加构造方法。便利构造方法最终也要调用指定构造方法。")
                    
                    CodeView(code: code_1).padding(10)
                }
                
                Section(header: SectionHeaderView(title: "可失败构造方法")) {
                    CommonTextView(content: "一个构造方法可能需要一些特定的参数，当传递的参数不符合要求时，开发者需要让这次构造失败，这时就需要使用可失败的构造方法。")
                    CodeView(code: code_2).padding(10)
                    
                }
                
                Section(header: SectionHeaderView(title: "析构方法")) {
                    CommonTextView(content: "析构方法和构造方法是互逆的，在实际的开发过程中，经常需要在类的实例销毁的时候将其中使用的资源释放掉，如关闭IO操作等")
                    CodeView(code: code_3).padding(10)
                }
            }
        }
    }
}

struct ConstructorView_Previews: PreviewProvider {
    static var previews: some View {
        ConstructorView()
    }
}
